package org.example.sparkdemo;

import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;

/**
 * 本程序通过Spark计算框架，读取文本文件，并统计文件中包含字母'a'和'b'的行数。
 */
public class SimpleApp2 {
    public static void main(String[] args) {
        // 指定日志文件路径，这里使用HDFS路径
        String logFile = "hdfs://master:9000/README.md";
        // 本地测试时可以使用以下路径
        // String logFile = "file:///usr/local/spark/README.md";

        // 初始化Spark配置，设置应用名称和主节点
        SparkConf conf = new SparkConf().setAppName("Simple Application").setMaster("local[*]");

        // 创建JavaSparkContext对象，用于与Spark交互
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 读取日志文件数据，并缓存 RDD
        JavaRDD<String> logData = sc.textFile(logFile).cache();

        // 过滤包含字母'a'的行，并统计行数
        long numAs = logData.filter(new Function<String, Boolean>() {
            public Boolean call(String s) {
                return s.contains("a");
            }
        }).count();

        // 过滤包含字母'b'的行，并统计行数
        long numBs = logData.filter(new Function<String, Boolean>() {
            public Boolean call(String s) {
                return s.contains("b");
            }
        }).count();

        // 输出统计结果
        System.out.println("字母a共有 " + numAs + "行，字母b共有" + numBs+"行");
    }
}
